//goLang的结构体的多种声明和使用方式
package main

import (
	"fmt"
)

type person struct {
	name string
	age  int
}

//比较两个人的年龄，返回年龄比较大的人和年龄差
func Older(p1, p2 person) (person, int) {
	if p1.age > p2.age {
		return p1, p1.age - p2.age
	}
	return p2, p2.age - p1.age
}

func main() {
	//第一种声明使用方式
	var person1 person
	person1.name, person1.age = "第一人", 20

	//第二种声明赋值方式：键值对形式,不用考虑结构体内的定义顺序
	person2 := person{age: 25, name: "第二人"}

	//第三种声明赋值方式：按定义的顺序初始化值
	person3 := person{"第三人", 50}

	//第四种方式 使用new 会使用零值来进行默认的初始化，
	//也就是说name字段会被赋值为空字符串，年龄会被赋值为0
	person4 := new(person)

	oneTwo_older, oneTwo_age_diff := Older(person1, person2)
	twoThree_older, twoThree_age_fiff := Older(person2, person3)
	oneThree_older, oneThree_age_diff := Older(person1, person3)

	fmt.Println(oneTwo_older.name, oneTwo_age_diff)
	fmt.Println(twoThree_older.name, twoThree_age_fiff)
	fmt.Println(oneThree_older.name, oneThree_age_diff)
	fmt.Println(person4.name, person4.age)
}
